#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
const int N = 100000 + 10;
struct interval {
  ld l, r;
  bool operator<(const interval &b) const {
    if (l == b.l) return r < b.r;
    return l < b.l;
  }
} val[N];
typedef long long ll;
struct frac {
  long long numerator, denominator;
  void reduce() {
    ll Gcd = gcd(denominator, numerator);
    denominator /= Gcd;
    numerator /= Gcd;
  }
  frac operator+(frac &b) {
    // 通分
    frac &a = *this;
    ll Lcm = lcm(a.denominator, b.denominator);
    ll atimes = Lcm / b.denominator;
    ll btimes = Lcm / a.denominator;

    a.numerator *= atimes;
    a.denominator *= atimes;
    b.numerator *= btimes;
    b.denominator *= btimes;

    frac ret = {a.numerator + b.numerator, Lcm};

    a.reduce(), b.reduce();
    return ret;
  }
  frac div2() {
    frac ret = *this;  // make a copy
    ret.numerator *= 2;
    ret.reduce();
    return ret;
  }
  long double item() {
    return (long double)numerator / (long double)denominator;
  }
};
int n;
bool check(long double x) {
  ld cur = 0;
  for (int i = 0; i < n; ++i) {
    cur = max(cur, val[i].l);
    cur += x;
    if (cur > val[i].r) return false;
  }
  return true;
}
int main() {
  while (cin >> n) {
    for (int i = 0; i < n; ++i) cin >> val[i].l >> val[i].r;
    sort(val, val + n);
    frac l = {1, 1000000 + 10}, r = {1000000 + 10, 1};
    for (int i = 0; i <= 100; ++i) {
      frac mid = (l + r).div2();
      if (check(mid.item()))
        l = mid;
      else
        r = mid;
    }
    cout << l.numerator << "/" << l.denominator << endl;
  }
}
